//基础语法 ts是js的超集. let const var.类型验证
//声明变量的类型语法 :
// let 变量名称:数据类型=初始值.
// let 变量名称:数据类型;
//数据类型 
//1.基础数据类型  string number boolean
let a:string;
    // a=10;//error  数字number类型不能赋值给string变量
    a='hello world';//正确
let b:string='hello GuangZhou';//声明并初始化
let c:number=50;
    c=99.99999;
let isUp:boolean=false;//布尔类型
    isUp=true;
    // isUp=299;//只能是boolean
    isUp=!299;//转化为boolean类型
//2.特殊类型
//2.1 any 任意类型
let d:any;
    d='字符串'
    d=1243;
    d=true;
let e; //默认就是any
    e=999;
    e="string";
//2.2 unknown  未知类型 
let f:unknown="string";
let f2:unknown;
    // f='';
let g:string;
    // g=f;//错误的 //unknown的范围比string类型范围广.
    g='hi!';
    f=g;//正确
//unknown类型 只能赋值给其他unknown类型 或 any 不能赋值给其他类型
    d=f;
    f2=f;
//对`unknown`类型进行操作时必须通过`typeof`、断言等方式缩小未知范围
let f3:unknown='hello! guangzhou!';
    if(typeof f3=='string') f3.substring(0,10);//用typeof 判断类型
    // f3=true;
    (f3 as string).substring(0,5);//断言  确定f3的类型为字符串
//2.3 never 类型 永不能到达终点 一般用在函数 死循环 或 抛出异常
function throwError():never{
   throw new Error('代码错误')
}
function diewhile():never{
    while(true){}
}
//2.4 void 表示空 函数返回为空.没有返回值.  <a href="javascript:void(0)">aa</a>
function doEat():void{
    // return 123;
}
doEat();
//2.5 null 和 undefined
let h:null=null;
    // h=123; //Error
    // h="string";//error
    // h={a:13};//error
let i:undefined;
    i=undefined; //正确
    // i='string'; //Error
// let j:null=document.getElementById('abc');//获取不到元素对象就是 null
let j:any=i; //正确
    j=h;//正确
let k:any='123';
    h=k;
//2.6 字面量 相当于常量
let m:10; //字面量类型
    // m=5;//错误
    m=10;//正确

//3.联合类型 声明变量可以指定多个数据类型
let n:string|number;//联合类型 n可以是string或number
    n=10;
    n='hi! good luck'
    // n=true;//错误
//4.类型别名 type指定类别名
type SN=string|number; //指定类型的别名为SN类型
let o:SN=10;
    o='string';
    // o=true;//错误
type People={//指定对象的别名
    username:string,
    age?:number, //?表示可以省略
    money:number
}
// let p1:People=123  错误
// let p1:People='string' 错误
let p1:People={
    username:'tom',
    // age:20,
    // money:"一个亿"//错误的
    money:9.99
}
/////////> 自动推论： TypeScript 会在没有明确的指定类型的时候自动推测出一个变量类型
//未赋值：推论为any类型
//赋值：推论为值所属类型
//不建议。
let q;//没有指定类型 那么这时候q就是any类型 推导
    q=10;
    q='字符串';
    q=true;
    q=null;
let r=3.141555555;//声明并初始化 ts会自动推论出 r应该是number类型
    // r='string';//错误
//> PS: 虽然ts能自动推断出变量的值，但在实际开发过过程中还是建议指定变量类型，这样更直观，也更容易读懂我们的代码
